package com.atguigu.dw.gamallcanal

import java.net.InetSocketAddress

import com.alibaba.otter.canal.client.CanalConnectors
import com.atguigu.constan.ConstanVal


/**
 * description ：canal连接工具类
 * author      ：剧情再美终是戏 
 * mail        : 13286520398@163.com
 * date        ：Created in 2020/2/13 11:06
 * modified By ：
 * version:    : 1.0
 */
object CanalClient {

  def main(args: Array[String]): Unit = {

    // 获取 canal 连接
    val connector = CanalConnectors.newSingleConnector(
      new InetSocketAddress(ConstanVal.CANAL_CLIENT_HOSTNAME, ConstanVal.CANAL_CLIENT_PORT),
      ConstanVal.CANAL_DISTINNATION_EXAMPLE,
      "",
      ""
    )
    if (null != connector) {
      connector.connect()
    } else {
      return
    }

    // 订阅监听的表
    connector.subscribe("gmall0830.(order_info|order_detail)")

    // 循环监听表的变化
    while (true) {
      // 每次最多拉取 100 条sql
      val message = if (connector.checkValid()) connector.get(100) else null

      // 从拉取的数据获取有变化的 entries 一个 entries 表示一条sql变化
      val entries = if (null != message) message.getEntries else null

      // 判断是否有变化的 sql entries
      if (null != entries && entries.size() > 0) {
        // 处理数据
       CanalHandler.handle(entries)
      } else {
        // 如果本次拉取的变化为空，就 2 秒以后再进行下一次的拉取
//        println("数据没有变化，2s后重新读取")
        Thread.sleep(2000)
      }
    }
  }
}
